نمایش نتایج: از شماره 1 تا 3 از مجموع 3
  1. #1
    بنیانگذار
    تاریخ عضویت
    2010 January
    محل سکونت
    زیر سایه خدا
    سن
    37
    ارسال ها
    1,308
    تشکر
    2,923
    تشکر شده 2,205 بار در 886 پست
    نوشته های وبلاگ
    37


    آيا اين پست براي شما سودمند بود؟ بله | خیر

    چگونگی بدست آوردن اطلاعات برنامه های نصب شده در سیستم ( مثل محل نصب ,نام برنامه و...)

    بسم الله الرحمن الرحیم
    خب امروز @lordvandad عزیز باعث شد تا مطلبی رو در مورد نحوه دریافت لیست برنامه های نصب شده روی سیستم بنویسیم .
    برنامه ما بصورت زیر هست :

    //In the name of GOD
    //Seyyed Hossein Hasan Pour
    //Ustmb.ir
    //Master.huricane@gmail.com
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.Win32;
    using WindowsInstaller;
    using System.Management;

    namespace GetInstalledAppsInfo
    {
    public partial class frmMain : Form
    {
    public frmMain()
    {
    InitializeComponent();
    }

    static int counter_All = 0;
    static int counter_installed = 0;

    private void btnGetInfo_Click(object sender, EventArgs e)
    {
    if (rdBtnRegisteryMethod.Checked)
    {
    txtBoxInfo.Text = GetInfo_ByRegistry();
    }
    else if (rdBtnMsiDll.Checked)
    {
    txtBoxInfo.Text = GetInfo_ByMsiDll();
    }
    else if (rdBtnWMI.Checked)
    {
    txtBoxInfo.Text = GetInfo_WMI();
    }
    lblNoPath.Text = String.Format("{0}/{1}",counter_All - counter_installed,counter_All);
    lblWithPath.Text = String.Format("{0}/{1}", counter_installed, counter_All);
    }


    private string GetInfo_ByMsiDll()
    {
    counter_All = counter_installed = 0;
    string installdir="";
    Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");

    //برای فعال شدن اینستالر از بخش ادد رفرنس وارد پوشه ویندوز -سیستم32 بشید و دی ال ال ام اس آی رو انتخاب کنید
    //using WindowsInstaller; بعد هم بالا این عبارت رو یوزینگ کنید.
    Installer msi = (Installer)Activator.CreateInstance(type);
    foreach (string productcode in msi.Products)
    {
    string productname = msi.get_ProductInfo(productcode, "InstalledProductName");
    if (msi.get_ProductInfo(productcode, "InstallLocation")!="")
    {
    installdir += String.Format("{0} => {1} ",productname, msi.get_ProductInfo(productcode, "InstallLocation") )+ Environment.NewLine;
    counter_installed++;
    }
    else
    {
    installdir += String.Format("{0} => {1} ", productname ,"{×}") + Environment.NewLine;
    }
    counter_All++;
    }
    return installdir;
    }

    private string GetInfo_ByRegistry()
    {


    // برنامه هایی که نصب میشن در رجیستری برای انیستالشون مسیر نصب رو قرار میدن
    //کافیه ما هم در این بخش لیست برنامه ها رو چک کنیم.
    //برای همه برنامه ها جواب نمیده اما تعداد بسیار زیادی رو پوشش میده .برای سایر برنامه هایی که اینجا موفق نبودیم از روشهای دیگه میتونیم استفاده کنیم
    string Info = "";
    RegistryKey key;

    //CurrentUser
    key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    Info += GetAppsInfo(key);

    //LocalMachine_32
    key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    Info += GetAppsInfo(key);

    //LocalMachine_64
    key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
    if (key != null)//منحصرا مربوط به ویندوزهای 64 بیتی. چون تو این ویندوز امکان اینکه برنامه های 64 بیتی هم باشن هست.اما اگه ویندوز 32 بیتی باشه ما این بخش رو نداریم
    {
    Info += GetAppsInfo(key);
    }
    //اگه باز برنامه شما مسیر نصبش مشخص نشد دو دلیل داره یا مدخل جداگانه ای برای خودش با نام خودش درست کرده
    //که میتونید با سرچ نامش و چک مدخلهاش اطلاعاتش رو بدست بیارید
    //یا اینکه مشکلی وجود داره و اطلاعاتش ناقصه .
    return Info;
    }

    private static string GetAppsInfo(RegistryKey key)
    {
    string AppsName = "";
    foreach (String keyName in key.GetSubKeyNames())
    {
    RegistryKey subkey = key.OpenSubKey(keyName);

    if (subkey.GetValue("DisplayName") != null)
    {
    if (subkey.GetValue("InstallLocation") != null)
    {
    AppsName += String.Format("{0} => {1} ",subkey.GetValue("DisplayName"),subkey.GetValue("InstallLocation"))+ Environment.NewLine;
    counter_installed++;
    }
    else
    {
    AppsName += String.Format("{0} {1}",subkey.GetValue("DisplayName"),"{×}")+ Environment.NewLine;
    }
    counter_All++;
    }
    }
    return AppsName;
    }
    //این بخش دارای عوارض ناخواسته ای هست. پیشنهاد میشه تا میتونید ازش پرهیز کنید
    //فقط برای مصارف آموزشی اینو گذاشتم.
    ////از بخش رفرنس دی ال ال های زیر رو ادد کنین :
    ////System.Managment
    private string GetInfo_WMI()
    {
    string app = "";
    //اطلاعات بیشتر
    //http://msdn.microsoft.com/en-us/library/windows/desktop/aa394378%28v=vs.85%29.aspx
    try
    {
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Product");

    app += "Win32_Product" + Environment.NewLine;

    foreach (ManagementObject queryObj in searcher.Get())
    {
    app += String.Format("Name: {0} => {1}", queryObj["Name"], queryObj["InstallLocation"]);
    }
    }
    catch (ManagementException ex)
    {
    MessageBox.Show(ex.Message);
    }
    return app;
    }
    }
    }




    خب توضیحات رو در داخل متن برنامه دادم و چیز زیادی نمونده برای گفتن . جز این مطلب که این روش هایی که بالا استفاده کردم صد در صد تمامی اطلاعات برنامه ها رو بهتون نمیدن اما حدود 82+ درصد رو راحت بهتون میدن .نکته دوم اینکه ممکنه شما بگردید و ببینید از طریق wmi هم میشه این کارو کرد.
    درسته که WMI امکانات فوق العاده ای بما میده اما تو این مورد خاص دقت کنید استفاده از WMI و کلاس WIN32_PRODUCTS آثار سویی داره . (در ضمن خیلی هم کنده این مورد)
    برای اطلاعات بیشتر پیشنهاد میکنم اینجا رو بخونید :
    http://gregramsey.net/2012/02/20/win32_product-is-evil/
    که برای همین من نحوه کار با اون رو تو برنامه نیاوردم .ازش بشدت پرهیز کنید.
    . wmi رو هم اضافه کردم .منتها باید خودتون enableش کنید اگه میخواید تستش کنید.
    اگه آدرس محل نصب برنامه رو بدست نیاوردید بهتره بر اساس نام برنامه تو رجیستری سرج کنید و اطلاعات رو بدست بیارید .
    امیدوارم به دردتون بخوره .


    موضوعات مشابه:
    فایل های پیوست شده
    ویرایش توسط Hossein : 20th October 2012 در ساعت 03:17 PM دلیل: اضافه کردن نمونه کد در استفاده از کلاس WIn32_product در WMI
    توکل بخدا
    http://DeepLearning.ir
    اولین و تنها مرجع یادگیری عمیق ایران


    هرکس از ظن خود شد یار من
    از درون من نجست اسرار من




  2. #2
    USTMB Student
    تاریخ عضویت
    2012 February
    محل سکونت
    بابل
    ارسال ها
    30
    تشکر
    41
    تشکر شده 69 بار در 24 پست
    نوشته های وبلاگ
    2


    آيا اين پست براي شما سودمند بود؟ بله | خیر
    وای... خب من که الان احساس جرم می کنم...


  3. #3
    بنیانگذار
    تاریخ عضویت
    2010 January
    محل سکونت
    زیر سایه خدا
    سن
    37
    ارسال ها
    1,308
    تشکر
    2,923
    تشکر شده 2,205 بار در 886 پست
    نوشته های وبلاگ
    37


    آيا اين پست براي شما سودمند بود؟ بله | خیر
    نقل قول نوشته اصلی توسط lordvandad نمایش پست ها
    :areyoukiddingme: وای... خب من که الان احساس جرم می کنم...
    بهتر دیدم بجای اینکه تو اون پست خیلی مختصر پیشنهاد استفاده از اینها رو بهت بدم یه نمونه رو تو انجمن بزارم برای رفرنسهای بعدی هم شما مشکلت حل بشه هم کار خودم برای آینده راحت تر بشه.
    نحوه استفاده از wmi و کلاس win32_products رو هم اوردم .که اگه خواستید بتونید تست کنید و نتایج رو ببینید.(فقط خیلی کنده )!
    امیدوارم مفید بوده باشه برای همتون

    توکل بخدا
    http://DeepLearning.ir
    اولین و تنها مرجع یادگیری عمیق ایران


    هرکس از ظن خود شد یار من
    از درون من نجست اسرار من




 

 

کاربران برچسب خورده در این موضوع

کلمات کلیدی این موضوع

علاقه مندی ها (Bookmarks)

علاقه مندی ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  


Powered by vBulletin
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.6.0
Persian Language By Ustmb.ir
این انجمن کاملا مستقل بوده و هیچ ارتباطی با دانشگاه علوم و فنون مازندران و مسئولان آن ندارد..این انجمن و تمامی محتوای تولید شده در آن توسط دانشجویان فعلی و فارغ التحصیل ادوار گذشته این دانشگاه برای استفاده دانشجویان جدید این دانشگاه و جامعه دانشگاهی کشور فراهم شده است.لطفا برای اطلاعات بیشتر در رابطه با ماهیت انجمن با مدیریت انجمن ارتباط برقرار کنید
ساعت 01:11 PM بر حسب GMT +4 می باشد.